package com.deductive.domain.sys;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import java.io.Serializable;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

/**
* 文件存储系统核心表，用于存储文件和目录的基本信息、元数据和状态信息
* @TableName sys_files
*/
@ApiModel(value = "SysFiles", description = "文件存储表")
@TableName(value ="sys_files")
@Data
public class SysFiles implements Serializable {

    /**
    * 文件唯一标识符，自增主键
    */
    @ApiModelProperty("文件唯一标识符，自增主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
    * 原始文件名，用户上传时的名称
    */
    @NotBlank(message="[原始文件名，用户上传时的名称]不能为空")
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("原始文件名，用户上传时的名称")
    @Length(max= 255,message="编码长度不能超过255")
    @TableField(value = "file_name")
    private String fileName;
    /**
    * 存储系统中的实际文件名，通常重命名避免冲突
    */
    @NotBlank(message="[存储系统中的实际文件名，通常重命名避免冲突]不能为空")
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("存储系统中的实际文件名，通常重命名避免冲突")
    @Length(max= 255,message="编码长度不能超过255")
    @TableField(value = "storage_name")
    private String storageName;
    /**
    * 文件在存储系统中的完整路径
    */
    @NotBlank(message="[文件在存储系统中的完整路径]不能为空")
    @Size(max= -1,message="编码长度不能超过-1")
    @ApiModelProperty("文件在存储系统中的完整路径")
    @Length(max= -1,message="编码长度不能超过-1")
    @TableField(value = "file_path")
    private String filePath;
    /**
    * 文件大小（字节），目录为0
    */
    @ApiModelProperty("文件大小（字节），目录为0")
    @TableField(value = "file_size")
    private Long fileSize;
    /**
    * 文件MIME类型，标识文件格式
    */
    @Size(max= 100,message="编码长度不能超过100")
    @ApiModelProperty("文件MIME类型，标识文件格式")
    @Length(max= 100,message="编码长度不能超过100")
    @TableField(value = "mime_type")
    private String mimeType;
    /**
    * 文件扩展名
    */
    @Size(max= 20,message="编码长度不能超过20")
    @ApiModelProperty("文件扩展名")
    @Length(max= 20,message="编码长度不能超过20")
    @TableField(value = "extension")
    private String extension;
    /**
    * MD5哈希值，用于去重和完整性校验
    */
    @ApiModelProperty("MD5哈希值，用于去重和完整性校验")
    @TableField(value = "md5_hash")
    private String md5Hash;
    /**
    * 文件上传时间
    */
    @ApiModelProperty("文件上传时间")
    @TableField(value = "upload_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date uploadTime;
    /**
    * 上传用户ID
    */
    @ApiModelProperty("上传用户ID")
    @TableField(value = "upload_user_id")
    private Long uploadUserId;
    /**
    * 最后修改时间
    */
    @ApiModelProperty("最后修改时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "last_modified")
    private Date lastModified;
    /**
    * 文件版本号，从1开始
    */
    @ApiModelProperty("文件版本号，从1开始")
    @TableField(value = "version")
    private Integer version;
    /**
    * 父目录ID，NULL表示根目录
    */
    @ApiModelProperty("父目录ID，NULL表示根目录")
    @TableField(value = "parent_id")
    private Long parentId;
    /**
    * 是否为目录：true-目录，false-文件
    */
    @ApiModelProperty("是否为目录：true-目录，false-文件")
    @TableField(value = "is_directory")
    private Boolean isDirectory;
    /**
    * 文件状态：1-正常，0-删除，2-隐藏，3-审核中，4-禁用
    */
    @ApiModelProperty("文件状态：1-正常，0-删除，2-隐藏，3-审核中，4-禁用")
    @TableField(value = "status")
    private Integer status;
    /**
    * 删除时间，用于软删除
    */
    @ApiModelProperty("删除时间，用于软删除")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "deleted_time")
    private Date deletedTime;


}
